#include <iostream>

using std::cout;
using std::endl;

//Q:malloc/free 与new/delete有什么区别？
//A:1. malloc/free是标准库函数,
//  new/delete是表达式
//  2. malloc申请的空间没有执行初始化操作
//     new表达式在执行时可以同时完成初始化操作
//  3. malloc参数传递的是申请的字节数，
//     new表达式不需要指定字节数,会根据类型自动获取空间大小

void test0()
{
    //动态申请堆空间
    int * p1 = (int *)malloc(sizeof(int));
    *p1 = 10;//初始化操作
    cout << "*p1:" << *p1 << endl;

    //不free,就会发生内存泄漏
    free(p1);
    p1 = NULL;
}

void test1()
{
    cout << "test1()" << endl;
    cout << "sizeof(int):" << sizeof(int) << endl;
    int * p1 = new int(10);
    cout << "*p1:" << *p1 << endl;

    //new表达开辟完空间后，要记得回收，必须使用delete表达
    delete p1;
    p1 = nullptr;
}

void test2()
{
    //开辟数组的空间，需要使用中括号[]
    //int * p1 = new int[5];//不加小括号，无法保证
    //申请数组时，加上小括号会进行清零操作
    int * p1 = new int[5]();
    for(int i = 0; i < 5; ++i) {
        cout << "p1[" << i << "]: " << p1[i] << endl;
    }

    //对于数组的回收，一定要加上中括号
    delete [] p1;
    p1 = nullptr;//SAFE DELETE操作
                 
    //p1 = NULL;
    cout << "p1:" << p1 << endl;

    //....
    //对于p1[0]的访问是一个非法的内存访问
    cout << "p1[0]: " << p1[0] << endl;
}

int main()
{
    /* test0(); */
    /* test1(); */
    test2();
    return 0;
}

